package com.coder.ipc.messenger

import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.ServiceConnection
import android.os.*
import androidx.appcompat.app.AppCompatActivity
import android.view.View
import android.widget.Toast
import com.coder.ipc.R

class MessengerActivity : AppCompatActivity() {
    /**
     * 与服务进行通信的 Messenger。
     */
    private var mService: Messenger? = null

    /**
     * 指示我们是否已在服务上调用绑定的标志。
     */
    private var bound: Boolean = false

    /**
     * 与服务主界面进行交互的类。
     */
    private val mConnection = object : ServiceConnection {
        override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
            // 建立与服务的连接后会调用此方法，从而为我们提供了可用于与服务进行交互的对象。
            // 我们正在使用 Messenger 来与服务进行通信，
            // 因此在这里我们从原始 IBinder 对象获得了客户端的表示形式。
            mService = Messenger(service)
            bound = true
            // 用来接收服务端的回复消息
            mClientMessenger = Messenger(ReplyingHandler(this@MessengerActivity))
        }

        override fun onServiceDisconnected(name: ComponentName?) {
            // 当与服务的连接意外断开时，即进程崩溃时，将调用此方法。
            mService = null
            bound = false
        }
    }

    /**
     * 用于接收服务器发来的消息
     */
    private lateinit var mClientMessenger: Messenger

    /**
     * 来自服务端回复消息的处理程序。
     */
    internal class ReplyingHandler(
            context: Context,
            private val applicationContext: Context = context.applicationContext
    ) : Handler() {
        override fun handleMessage(msg: Message) {
            Toast.makeText(applicationContext, "oh my god!", Toast.LENGTH_SHORT).show()
            super.handleMessage(msg)
        }
    }

    fun sayHello(v: View) {
        if (!bound) return
        // 使用支持的 “what” 值创建并向服务发送消息
        val msg: Message = Message.obtain(null, MSG_SAY_HELLO, 0, 0)
        // 指定服务回复的 Messenger
        msg.replyTo = mClientMessenger
        try {
            mService?.send(msg)
        } catch (e: RemoteException) {
            e.printStackTrace()
        }
    }


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_messenger)
    }

    override fun onStart() {
        super.onStart()
        // Bind to the service
        Intent(this, MessengerService::class.java).also { intent ->
            bindService(intent, mConnection, Context.BIND_AUTO_CREATE)
        }
    }

    override fun onStop() {
        super.onStop()
        // Unbind from the service
        if (bound) {
            unbindService(mConnection)
            bound = false
        }
    }
}